#include<iostream>
#include<queue>
#include<map>
using namespace std;
string mb="123804765";
int fx[4]={1,-1,0,0};
int fy[4]={0,0,1,-1};
map<string,int>m;
struct node{
    double jz;
    string zt;
    int x;
    int y;
    double g;
    node(string x1):zt(x1){
        string bj=mb;
         jz=0;
        for(int i=0;i<9;i++){
            if(zt[i]!=mb[i])jz++;
            if(zt[i]=='0'){
                x=i/3+1;
                y=i%3+1;
            }
        }
        jz*=0.5;
        g=0;
    }
};
int dep;
bool check(string s){
    for(int i=0;i<9;i++){
        if(s[i]!=mb[i])return 0;
    }
    return 1;
}
void dfs(double g,node s){
    if(g==dep){
        if(check(s.zt)){
            cout<<g;
            exit(0);
        }
    }
    for(int i=0;i<4;i++){
        int nx=s.x+fx[i];
        int ny=s.y+fy[i];
        if(nx>3||nx<1||ny>3||ny<1)continue;
        string ns=s.zt;
        swap(ns[(nx-1)*3+ny-1],ns[(s.x-1)*3+s.y-1]);
        node ss(ns);
        if(ss.jz+g+1<=dep&&(!m.count(ns)||(m[ns]>g+1))){
            m[ns]=g+1;
            dfs(g+1,ss);
        }
    }
}
int main(){
    string x;
    cin>>x;
    for(dep=0;dep<=30;dep++){
        m.clear();
        dfs(0,node(x));
    }
    return 0;
}